package com.hyper_yang.javase.reflection_annotation.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
自定义注解:
    声明关键字: @interface
    数据类型 属性名();
  注意:
    1.属性的数据类型：8个基本、String类型、Class、枚举、注解类型
    2.以上所有类型的一维数组。
    3.注解的本质：
        public interface MyAnnotation extends Annotation{
            public abstract int a();
        }
    4.元注解：标识注解的注解
        @Target ：标识注解可以使用的位置
            ElementType.TYPE类上、ElementType.FIELD属性上、ElementType.METHOD 方法上
        @Retention
            SOURCE 保留在编译期，编译后就抛弃了
            CLASS  保留在class字节码文件里。 运行后就抛弃了
            RUNTIME 保留在编译期、字节码文件，保留运行  只有这个时机才可以被反射获取操作
 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface DefineAnno {
    int a() default 18;

    String name();

    Class<?> c();

    // 枚举 enum 要新建类 这里省略

    String[] aaa();
}
